#pragma once
#include "std/vector"
#include "struct.hpp"
#include "NetLib/MemoryMgr.h"


class CGuild
{
public:
	struct vtable_t
	{
		void* (CGuild::* scalar_deleting_destructor)(unsigned int);
		void (CGuild::* Init)(void);
	};

	/* this+0x0   */ //const CGuild::`vftable'
	/* this+0x4   */ protected: int m_GDID;
	/* this+0x8   */ protected: int m_level;
	/* this+0xC   */ protected: char m_guildName[24];
	/* this+0x24  */ protected: char m_guildMasterName[24];
	/* this+0x3C  */ protected: int m_maxUserNum;
	/* this+0x40  */ protected: int m_userNum;
	/* this+0x44  */ protected: int m_honor;
	/* this+0x48  */ protected: int m_virtue;
	/* this+0x4C  */ protected: int m_type;
	/* this+0x50  */ protected: int m_class;
	/* this+0x54  */ protected: int m_money;
	/* this+0x58  */ protected: int m_arenaWin;
	/* this+0x5C  */ protected: int m_arenaLose;
	/* this+0x60  */ protected: int m_arenaDrawn;
	/* this+0x64  */ protected: char m_manageLand[24];
	/* this+0x7C  */ protected: int m_exp;
	/* this+0x80  */ protected: int m_emblemVersion;
	/* this+0x84  */ protected: int m_point;
	/* this+0x88  */ protected: char m_desc[80];
	/* this+0xD8  */ protected: int m_isEmblemLoad;
	/* this+0xDC  */ protected: int m_emblemSize;
	/* this+0xE0  */ protected: GUILDNOTICE m_guildNotice;
	/* this+0x198 */ protected: char m_guildEmblem[3*1024];
	/* this+0xD98 */ protected: mystd::vector<GUILDMINFO *> m_guildMInfo;
	/* this+0xDA8 */ protected: mystd::vector<GUILDALLYINFO *> m_guildAllyInfo;
	/* this+0xDB8 */ protected: mystd::vector<GUILDBANISHINFO *> m_guildBanishInfo;
	/* this+0xDC8 */ protected: mystd::vector<GUILDMPOSITION *> m_guildMPosition;
	/* this+0xDD8 */ protected: CMemoryMgr<GUILDMINFO> m_GuildMInfoMPool;
	/* this+0xE08 */ protected: CMemoryMgr<GUILDALLYINFO> m_GuildAllyInfoMPool;
	/* this+0xE38 */ protected: CMemoryMgr<GUILDBANISHINFO> m_GuildBanishInfoMPool;
	/* this+0xE68 */ protected: CMemoryMgr<GUILDMPOSITION> m_GuildMPositionMPool;
	/* this+0xE98 */ protected: int m_skillDataLength;
	/* this+0xE9C */ protected: int m_skillPoint;
	/* this+0xEA0 */ protected: unsigned char m_skillData[300];

	public: CGuild::CGuild(void);
	public: virtual CGuild::~CGuild(void);
	public: int CGuild::FindBanishMember(int GID);
	public: void CGuild::UpdateMemberStatus(int Stat, int GID, short job, int Level, short sex, short head, short headpal);
	public: void CGuild::UpdateMemberJob_Level(int GID, int Job, int Level);
	public: void CGuild::UpdateMemberChangePos(unsigned long GID, unsigned int PosID);
	public: void CGuild::UpdateMemberPosition(unsigned long PositionID, char* Name, int Service, int Join, int Penalty);
	public: int CGuild::FindAllyGuild(unsigned long GDID);
	public: int CGuild::FindHostileGuild(unsigned long GDID);
	public: int CGuild::IsMaster(unsigned long GID);
	public: int CGuild::GetPosJoinRight(unsigned long PosID);
	public: int CGuild::GetPosPenaltyRight(unsigned long PosID);
	public: int CGuild::GetAllyCount(void);
	public: int CGuild::GetHostileCount(void);
	public: void CGuild::GetGuildInfo(GUILDINFO* Info);
	public: virtual void CGuild::Init(void);
	public: void CGuild::DeleteMPosition(void);
	public: void CGuild::DeleteBanishInfo(void);
	public: void CGuild::DeleteMInfo(void);
	public: void CGuild::DeleteAllyInfo(void);
	public: int CGuild::DeleteFirstBanishInfo(void);
	public: void CGuild::ClearAll(void);
	public: void CGuild::SetGuildMasterName(char* Name);
	public: void CGuild::SetGuildName(char* GName);
	public: void CGuild::SetGuildInfo(GUILDINFO* Info);
	public: void CGuild::SetEmblemVersion(int Ver);
	//public: void CGuild::SetGuildLevel(int);
	public: void CGuild::SetMaxUserNum(int Num);
	//public: void CGuild::SetGuildExp(int);
	public: void CGuild::SetGDID(unsigned long GDID);
	//public: void CGuild::SetEmblemLoad(int);
	//public: void CGuild::SetLevel(int);
	//public: void CGuild::SetSkillPoint(int);
	public: void CGuild::SetSkillData(const unsigned char* in_DataPtr, const int in_DataLength);
	public: int CGuild::GetGuildMemberOnline(void);
	public: char* CGuild::GetPosName(unsigned long PosID);
	public: char* CGuild::GetMemberName(unsigned long GID);
	public: int CGuild::GetMemberExp(unsigned long GID);
	public: int CGuild::GetMemberLevel(unsigned long GID);
	public: int CGuild::GetMemberClass(unsigned long GID);
	public: void CGuild::GetGuildPosID(char* Buf);
	public: int CGuild::GetGuildPosID(unsigned long GID);
	public: int CGuild::isJoinRight(unsigned long GID);
	public: int CGuild::isPenaltyRight(unsigned long GID);
	public: void CGuild::AddGuildMInfo(GUILDMINFO* Info);
	public: void CGuild::AddGuildAllyInfo(GUILDALLYINFO* Info);
	public: void CGuild::AddGuildBanishInfo(GUILDBANISHINFO* Info);
	public: void CGuild::AddGuildMPosition(GUILDMPOSITION* Info);
	public: int CGuild::GetAverageLevel(void);
	public: int CGuild::GetGuildMSize(void);
	public: int CGuild::GetGuildMAllocSize(void);
	public: int CGuild::FindMember(unsigned long GID);
	public: int CGuild::GetGuildAllySize(void);
	public: int CGuild::GetGuildBanishSize(void);
	public: int CGuild::GetGuildMPosSize(void);
	public: int CGuild::UpdateMoney(int Amount, int Type);
	public: GUILDMINFO* CGuild::AllocGuildMInfo(void);
	public: GUILDALLYINFO* CGuild::AllocGuildAllyInfo(void);
	public: GUILDBANISHINFO* CGuild::AllocGuildBanishInfo(void);
	public: GUILDMPOSITION* CGuild::AllocGuildMPosition(void);
	public: void CGuild::DeleteGuildAllyInfo(unsigned long GDID, int Type);
	public: void CGuild::DeleteGuildBanishInfo(unsigned long GID);
	public: void CGuild::DeleteGuildMInfo(unsigned long GID);
	public: int CGuild::AddGuildExp(unsigned long GID, int Exp);
	public: int CGuild::GetServiceRate(unsigned long PositionID);
	public: void CGuild::GetGuildMemberInfo(unsigned long GID, GUILD_MEMBER_INFO& Info);
	public: void CGuild::GetGuildBanishInfo(char* Buf);
	public: void CGuild::GetGuildAllyInfo(char* Buf);
	public: void CGuild::GetGuildMPosition(char* Buf);
	public: void CGuild::InitGuildMInfo(GUILDMINFO* Guild, char* Name, char* Account, unsigned long AID, unsigned long GDID, unsigned long GID, int Position, int Stat, int Level, int Class);
	public: void CGuild::InitGuildMInfo(GUILDMINFO* Guild, char* Name, char* Account, unsigned long AID, unsigned long GDID, unsigned long GID, int Position, int Stat, int Level, int Job, int head, int headpal, int sex);
	public: int CGuild::GetGDID(void);
	public: int CGuild::GetLevel(void);
	public: char* CGuild::GetGuildName(void);
	public: char* CGuild::GetMasterName(void);
	public: int CGuild::GetMaxUserNum(void);
	public: int CGuild::GetHonor(void);
	public: int CGuild::GetVirtue(void);
	public: int CGuild::GetType(void);
	public: int CGuild::GetClass(void);
	public: int CGuild::GetMoney(void);
	public: int CGuild::GetArenaWin(void);
	public: int CGuild::GetArenaLose(void);
	public: int CGuild::GetArenaDrawn(void);
	public: char* CGuild::GetManageLand(void);
	public: int CGuild::GetExp(void);
	public: int CGuild::GetEmblemVersion(void);
	public: int CGuild::GetPoint(void);
	public: char* CGuild::GetDesc(void);
	public: char* CGuild::GetNotice(void);
	public: char* CGuild::GetNoticeSubject(void);
	public: void CGuild::UpdateNotice(const unsigned long in_GuildID, mystd::string& in_Subject, mystd::string& in_Notice);
	public: char* CGuild::GetEmblem(void);
	public: int CGuild::IsEmblemLoad(void);
	public: int CGuild::GetEmblemSize(void);
	protected: void CGuild::SetMoney(int Money);
	protected: int CGuild::AddMoney(int Money);

private:
	static hook_method<int (CGuild::*)(int GID)> CGuild::_FindBanishMember;
	static hook_method<void (CGuild::*)(int Stat, int GID, short job, int Level, short sex, short head, short headpal)> CGuild::_UpdateMemberStatus;
	static hook_method<void (CGuild::*)(int GID, int Job, int Level)> CGuild::_UpdateMemberJob_Level;
	static hook_method<void (CGuild::*)(unsigned long PositionID, char* Name, int Service, int Join, int Penalty)> CGuild::_UpdateMemberPosition;
	static hook_method<int (CGuild::*)(unsigned long GDID)> CGuild::_FindAllyGuild;
	static hook_method<int (CGuild::*)(unsigned long GDID)> CGuild::_FindHostileGuild;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_IsMaster;
	static hook_method<int (CGuild::*)(unsigned long PosID)> CGuild::_GetPosJoinRight;
	static hook_method<int (CGuild::*)(unsigned long PosID)> CGuild::_GetPosPenaltyRight;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetAllyCount;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetHostileCount;
	static hook_method<void (CGuild::*)(GUILDINFO* Info)> CGuild::_GetGuildInfo;
	static hook_method<void (CGuild::*)(void)> CGuild::_Init;
	static hook_method<void (CGuild::*)(void)> CGuild::_DeleteMPosition;
	static hook_method<void (CGuild::*)(void)> CGuild::_DeleteBanishInfo;
	static hook_method<void (CGuild::*)(void)> CGuild::_DeleteMInfo;
	static hook_method<void (CGuild::*)(void)> CGuild::_DeleteAllyInfo;
	static hook_method<int (CGuild::*)(void)> CGuild::_DeleteFirstBanishInfo;
	static hook_method<void (CGuild::*)(void)> CGuild::_ClearAll;
	static hook_method<void (CGuild::*)(char* Name)> CGuild::_SetGuildMasterName;
	static hook_method<void (CGuild::*)(char* GName)> CGuild::_SetGuildName;
	static hook_method<void (CGuild::*)(GUILDINFO* Info)> CGuild::_SetGuildInfo;
	static hook_method<void (CGuild::*)(int Ver)> CGuild::_SetEmblemVersion;
	static hook_method<void (CGuild::*)(int Num)> CGuild::_SetMaxUserNum;
	static hook_method<void (CGuild::*)(unsigned long GDID)> CGuild::_SetGDID;
	static hook_method<void (CGuild::*)(const unsigned char* in_DataPtr, const int in_DataLength)> CGuild::_SetSkillData;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildMemberOnline;
	static hook_method<char* (CGuild::*)(unsigned long PosID)> CGuild::_GetPosName;
	static hook_method<char* (CGuild::*)(unsigned long GID)> CGuild::_GetMemberName;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_GetMemberExp;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_GetMemberLevel;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_GetMemberClass;
	static hook_method<void (CGuild::*)(char* Buf)> CGuild::_GetGuildPosID;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_GetGuildPosID2;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_isJoinRight;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_isPenaltyRight;
	static hook_method<void (CGuild::*)(GUILDMINFO* Info)> CGuild::_AddGuildMInfo;
	static hook_method<void (CGuild::*)(GUILDALLYINFO* Info)> CGuild::_AddGuildAllyInfo;
	static hook_method<void (CGuild::*)(GUILDBANISHINFO* Info)> CGuild::_AddGuildBanishInfo;
	static hook_method<void (CGuild::*)(GUILDMPOSITION* Info)> CGuild::_AddGuildMPosition;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetAverageLevel;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildMSize;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildMAllocSize;
	static hook_method<int (CGuild::*)(unsigned long GID)> CGuild::_FindMember;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildAllySize;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildBanishSize;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGuildMPosSize;
	static hook_method<int (CGuild::*)(int Amount, int Type)> CGuild::_UpdateMoney;
	static hook_method<GUILDMINFO* (CGuild::*)(void)> CGuild::_AllocGuildMInfo;
	static hook_method<GUILDALLYINFO* (CGuild::*)(void)> CGuild::_AllocGuildAllyInfo;
	static hook_method<GUILDBANISHINFO* (CGuild::*)(void)> CGuild::_AllocGuildBanishInfo;
	static hook_method<GUILDMPOSITION* (CGuild::*)(void)> CGuild::_AllocGuildMPosition;
	static hook_method<void (CGuild::*)(unsigned long GDID, int Type)> CGuild::_DeleteGuildAllyInfo;
	static hook_method<void (CGuild::*)(unsigned long GID)> CGuild::_DeleteGuildBanishInfo;
	static hook_method<void (CGuild::*)(unsigned long GID)> CGuild::_DeleteGuildMInfo;
	static hook_method<int (CGuild::*)(unsigned long GID, int Exp)> CGuild::_AddGuildExp;
	static hook_method<int (CGuild::*)(unsigned long PositionID)> CGuild::_GetServiceRate;
	static hook_method<void (CGuild::*)(unsigned long GID, GUILD_MEMBER_INFO& Info)> CGuild::_GetGuildMemberInfo;
	static hook_method<void (CGuild::*)(char* Buf)> CGuild::_GetGuildBanishInfo;
	static hook_method<void (CGuild::*)(char* Buf)> CGuild::_GetGuildAllyInfo;
	static hook_method<void (CGuild::*)(char* Buf)> CGuild::_GetGuildMPosition;
	static hook_method<void (CGuild::*)(GUILDMINFO* Guild, char* Name, char* Account, unsigned long AID, unsigned long GDID, unsigned long GID, int Position, int Stat, int Level, int Class)> CGuild::_InitGuildMInfo;
	static hook_method<void (CGuild::*)(GUILDMINFO* Guild, char* Name, char* Account, unsigned long AID, unsigned long GDID, unsigned long GID, int Position, int Stat, int Level, int Job, int head, int headpal, int sex)> CGuild::_InitGuildMInfo2;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetGDID;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetLevel;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetGuildName;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetMasterName;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetMaxUserNum;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetHonor;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetVirtue;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetType;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetClass;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetMoney;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetArenaWin;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetArenaLose;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetArenaDrawn;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetManageLand;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetExp;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetEmblemVersion;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetPoint;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetDesc;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetNotice;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetNoticeSubject;
	static hook_method<void (CGuild::*)(const unsigned long in_GuildID, mystd::string& in_Subject, mystd::string& in_Notice)> CGuild::_UpdateNotice;
	static hook_method<char* (CGuild::*)(void)> CGuild::_GetEmblem;
	static hook_method<int (CGuild::*)(void)> CGuild::_IsEmblemLoad;
	static hook_method<int (CGuild::*)(void)> CGuild::_GetEmblemSize;
	static hook_method<void (CGuild::*)(int Money)> CGuild::_SetMoney;
	static hook_method<int (CGuild::*)(int Money)> CGuild::_AddMoney;
};
